const Koa = require('koa')
const router = require('koa-router')() // 注意：引入的方式
// const views = require('koa-views')
var bodyParser = require('koa-bodyparser');
const serve = require('koa-static');
const render = require('koa-art-template');
const path = require('path')

const app = new Koa();

// 配置koa-art-template模板引擎
render(app, {
  root: path.join(__dirname, 'views'), // 视图的位置
  extname: '.html', // .art 后缀名
  debug: process.env.NODE_ENV !== 'production' // 是否开启调试模式
});

app.use(serve('static'))

app.use(bodyParser());
// 配置第三方中间件
// app.use(views('views', {map: {html: 'ejs'}})) // 后缀名.html
// 
// app.use(views(__dirname + '/views', {extension: 'ejs'})) // 后缀名.ejs

// 注意：我们需要在每一个路由的render里面都要渲染一个公共的数据
// ctx.state = {
//   session: this.session,
//   title: 'app'
// };
// 写一个中间件配置公共的信息
app.use(async (ctx, next) => {
  ctx.state = {
    title: 'app'
  };
  await next() // 当前路由匹配完成以后继续向下匹配，不写 next 就不会继续向下匹配
})
// 1. 应用级中间件 匹配任何路由
// 3. 错误处理中间件
app.use(async (ctx, next) => {
  await next();
  if(ctx.status === 404) {
    ctx.status = 404;
    ctx.body = '这是一个404页面'
  }
})

// ctx 上下文context，包含了request和response等信息
// 配置路由
router.get('/', async function (ctx) {
  let name = new Buffer('张三').toString('base64')
  ctx.cookies.set('userInfo', name, {
    maxAge: 60 * 1000 * 60,
    // expires: '2021-09-26',
    // path: '/list', // 配置可以访问的页面
    // domain: '.baidu.com', // 表示a.baidu.com b.baidu.com 共享cookie的数据，正常情况下不要设置，默认就是当前域下面的所有页面都可以访问
    // httpOnly: true, // true表示这个cookie只有服务器端可以访问，false表示客户端（js），服务端都可以访问
  })
  await ctx.render('index')
  // ctx.body = 'hello koa' // 返回数据 相当于：原生里面的res.writeHead() res.end()
})

router.get('/login', async function (ctx) {
  await ctx.render('login')
})

router.post('/doLogin', async ctx => {
  ctx.body = ctx.request.body;
})

router.get('/list', async ctx => {
  let userInfo = ctx.cookies.get('userInfo')
      userInfo = new Buffer(userInfo, 'base64').toString()

  let list = {
    title: '<h3>' + userInfo + '</h3>',
    num: 20,
    arr: ['1111', '2222', '3333']
  }
  ctx.render('list', {
    list
  })
})

// 作用：启动路由
app.use(router.routes()).use(router.allowedMethods())  // 可以配置也可以不配置，建议配置
// 作用：这是官方文档的推荐用法，我们可以看到router.allowedMethods()用在了路由匹配router.routes()之后，所以在当所有路由中间件最后调用，此时根据ctx.status设置response响应头

app.listen(3000, () => {
  console.log('starting at port 3000')
})
